package come.bjpowernode.javase.exam1;
/*
//面试题;
    doOther()在执行的时候需要等待doSome()方法的结束吗？
    不需要因为doOther()方法没有synchronize的

 */
public class Exam01 {
    public static void main(String[] args) {
        //t1线程t2线程共享mc
        MyClass mc = new MyClass();
        Thread t1 = new MyThread(mc);
        Thread t2 = new MyThread(mc);
        Thread t3 = new MyThread(mc);
        t1.setName("t1");
        t2.setName("t2");
        t3.setName("t3");

        t1.start();
        try {
            //这个睡眠的作用是为了保证t1线执行
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
        t3.start();
    }
}
class MyThread extends Thread{
    private MyClass mc;
    public MyThread(MyClass mc){
        this.mc = mc;
    }
    public void run(){
        if(Thread.currentThread().getName().equals("t1") || Thread.currentThread().getName().equals("t3")){
            mc.doSome();
        }
        if(Thread.currentThread().getName().equals("t2")){
            mc.doOther();
        }
    }
}

class MyClass{

    //synchronize出现在实例方法上表示锁this 当你使用synchronized锁定this关键字时，
    // 你实际上是锁定了当前对象实例。这意味着只有拥有该对象实例的线程才能访问被synchronized锁定的代码块或方法。
    public synchronized void doSome(){
        System.out.println(Thread.currentThread().getName()+ "：doSome begin!");
        try {
            Thread.sleep(1000*10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"：doSome over!");
    }
    public  void doOther(){
        System.out.println(Thread.currentThread().getName() + "：doOther begin");
        System.out.println(Thread.currentThread().getName() + "：doOther over");

    }
}
